Exploration 1 : La précarité énergétique des quartiers de Rouen

Révisions de statistique bivariée

Author

Claude Grasland

Published

March 9, 2026

Code
library(knitr)
library(dplyr)
library(questionr)

library(sf)
library(mapsf)
library(ggplot2)

Dans cette première exploration on va commencer en prendre en main les données en se donnant comme objectif d’étudier les variations de précarité énergétique entre les quartiers de la commune de Rouen. On se limitera à l’utilisation d’outils statistiques - apparemment - simples de statistique bivariée que l’on complexifiera progressivement.

1. Données

Données géométriques

On extrait du fond de carte des 42 IRIS la commune de Rouen et on crée un fonds de carte regroupant ceux-ci en 10 quartiers.

Code
map_iris <- readRDS("data/mapiris.RDS") %>% filter(substr(iris_code,1,5)=="76540")
map_quart <- map_iris %>% group_by(quart_code, quart_name) %>%
                         summarise() 
map_com <- map_iris %>% summarise()


mf_map(map_iris, type="typo",var="quart_code", border="white",lwd=0.5, leg_title = "Quartiers")
mf_map(map_quart, type = "base", col=NA, add=T, border="black",lwd=1)
mf_layout("Iris et quartiers de Rouen", frame = T, credits = "Source : IGN")

Données statistiques

On extrait du fichier DPE les diagnistics relatifs à la commune de Rouen et on sélectionne un nombre volontairement limité d’indicateurs.

Code
map_dpe<-readRDS("data/dpe.RDS") %>%
           filter(com_code == "76540",
                  substr(quart_code,1,5) == "76540") %>%
           select(quart_code, 
                  quart_name,
                  dpe,
                  sup,
                  con_tot,
                  con_m2,
                  dat,
                  typ) %>% 
          mutate(quart_code = as.character(quart_code),
                 quart_name = as.character(quart_name))
don<-st_drop_geometry(map_dpe) %>% filter(is.na(dpe)==F,
                                          is.na(con_m2)==F)

kable(head(don), caption= "Extrait du fichier DPE")
Extrait du fichier DPE
quart_code quart_name dpe sup con_tot con_m2 dat typ
7654001 Centre Rive Droite Ouest D 56.7 13449.7 237.2 1900 appartement
7654006 Quartiers Est F 90.6 29722.1 328.0 1948 appartement
7654001 Centre Rive Droite Ouest D 70.0 12936.9 192.0 1949 maison
7654003 Centre Rive Gauche G 19.7 15175.8 769.1 1949 appartement
7654001 Centre Rive Droite Ouest D 62.1 15101.9 243.0 1947 appartement
7654002 Centre Rive Droite Est E 35.7 4503.5 289.0 1948 appartement

Superposition

On superpose les deux sources de données en utilisant les localisations du fichier dpe :

Code
mf_map(map_quart, type = "base", col="lightyellow", border="black",lwd=1)
mf_map(map_dpe, type="base", col="red",pch=20, cex=0.1, add=T)
mf_layout("Localisation des DEP par quartiers de Rouen", frame = T, credits = "Source : IGN")

2. Quelle mesure de précarité ?

Quelle est la variable que nous souhaitons analyser ? Les passoires énergétiques sont en principe définies par l’appartenance aux catégories énergétiques F et G.

Etiquette énergétique en 7 classes

Quelle est la distribution générale des étiquettes énergétiques ? Réalisons un tableau et un graphique.

Code
#Tableau
tab <- freq(don$dpe,cum = T,valid = F)
kable(tab, caption = "Etiquettes énergétiques des logements")
Etiquettes énergétiques des logements
n % %cum
A 144 0.3 0.3
B 1194 2.2 2.5
C 15512 29.1 31.6
D 17211 32.3 64.0
E 11988 22.5 86.5
F 4209 7.9 94.4
G 2987 5.6 100.0
Code
# Graphique
mypal7<-c("green4","green3","lightgreen","yellow","goldenrod1","darkorange","red")
plot(don$dpe, col=mypal7, 
        main = "Etiquettes énergétiques des logements",
        sub =  "Source : Base DPE, Commune de Rouen",
        ylab = "Nombre de logements")

  • Les catégories les plus fréquentes sont les catégories intermédiaires (C, D et E) qui représentent environ trois-quarts du parc de logement étudié. Les logements à faible consommation (A ou B) ne représentent que 2.5% du total. Les logements à forte consommation (F ou G) totalisent 13.5% du total

Etiquette et consommation d’énergie primaire par m2

Même si la correspondance n’est pas parfaite, il existe un lien étroit entre la consommation d’énergie primaire par m2 de logement habitable (en log) et l’étiquette DPE attribuée par l’ADEME.

Code
# Graphique R-Base
mypal7<-c("green4","green3","lightgreen","yellow","goldenrod1","darkorange","red")
boxplot(don$con_m2~don$dpe, 
        col=mypal7, 
        cex=0.2, 
        log ="y",
        xlab="Consommation d'énergie primaire par m2",
        ylab = "Etiquette DPE",
        main="Relation entre étiquettes et consommation d'énergie",
        sub = "Source : Base DPE, Commune de Rouen")
grid(lwd=1)

Code
#Graphique ggplot2
mypal7<-c("green4","green3","lightgreen","yellow","goldenrod1","darkorange","red")
ggplot(don) + aes(x=dpe,y=con_m2)+
              geom_violin(aes(fill=dpe)) + 
              scale_y_log10("Consommation d'énergie primaire par m2") + 
              scale_x_discrete("Etiquette DPE")+
              scale_fill_manual(values=mypal7) + 
              theme_light() +
              ggtitle(label = "Relation entre étiquettes et consommation d'énergie",
                      subtitle = "Source : Base DPE, Commune de Rouen"
                        )

Ceci suggère que l’analyse pourrait dans certains cas porter sur cette variable quantitative continue plutôt que sur la variable qualitative ordinale qu’est l’étiquette. Mais en utilisant de préférence une échelle logarithmique.

Code
ggplot(don, aes(x=con_m2)) +
      geom_histogram()+ 
      scale_x_log10("Consommation d'énergie primaire par m2 (log)") + 
      scale_y_continuous("Nombre de logements") +
      theme_light() +
      ggtitle(label = "Consommation d'énergie primaire par m2",
                      subtitle = "Source : Base DPE, Commune de Rouen"
                        )

Seuil énergétique des passoires

On peut assez facilement déduire empiriquement le seuil d’apparition des passoires énergétiques à l’aide d’un modèle Logit :

Code
don$dpe2 <- don$dpe %in% c("F","G")
mod1 <- glm(formula = dpe2~con_m2, family = "binomial", data=don)
summary(mod1)

Call:
glm(formula = dpe2 ~ con_m2, family = "binomial", data = don)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -1.745e+01  2.346e-01  -74.39   <2e-16 ***
con_m2       4.891e-02  6.818e-04   71.74   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 42176.3  on 53244  degrees of freedom
Residual deviance:  9537.9  on 53243  degrees of freedom
AIC: 9541.9

Number of Fisher Scoring iterations: 9
Code
plot(mod1$data$con_m2, 
     mod1$fitted.values, 
     cex=0.1, 
     pch=20, 
     col="red", 
     log="x",
     main = "Résultat du modèle Logit",
     xlab = "Consommation d'énergie primaire par m2",
     ylab = "Probabilité d'être une passoire énergétique",
     subtitle = "Source : Base DPE, Commune de Rouen")
points(357, 0.5, pch=20, cex=2)
text(100, 0.55, "Probabilité = 0.5", col="blue")
text(357, 0.01, "357 Kwh/m2/an", col="blue")
abline(h=0.5, lty=2, col = "blue")
abline(v=357, lty=2, col= "blue")

La valeur seuil obtenue est de 357 Kwh/m2, ce qui est légèrement supérieur à la valeur de référence donnée par l’ADEME qui est de 330 Kwh/m2/an pour le passage de la catégorie E à la catégorie F. On peut vérifier que l’approximation est nénamoins très proche de la réalité en comparant les passoires énergétiques déclarées par l’ADEME et l’estimation faite à partir du seuil observé grâce au modèle Logit :

Code
obs <-don$dpe2
est <-don$con_m2 > 357
conf<-table(obs,est)
tabres <- addmargins(conf)
tabres
       est
obs     FALSE  TRUE   Sum
  FALSE 45441   608 46049
  TRUE   1087  6109  7196
  Sum   46528  6717 53245

3. Précarité par quartier

Pourcentage de passoires

Si on part de la variable booléenne, on obtient facilement un pourcentage de passoires énergétiques par quartier :

Code
tab1 <- don %>% group_by(quart_code, quart_name) %>% 
                summarise(tot = n(),
                          pas = sum(dpe2)) %>%
                mutate(pct = 100*pas/tot) %>%
                arrange(pct)
kable(tab1,
      digits = c(0,0,0,0,2),
      col.names = c("Code","Nom","Total", "N", "%"),
      caption = "Nombre et proportion de passoires énergétiques par quartier")
Nombre et proportion de passoires énergétiques par quartier
Code Nom Total N %
7654008 Chatelet Lombardie 2079 0 0.00
7654009 Grand Mare 2622 40 1.53
7654007 Sapins 2439 175 7.18
7654010 Saint-Clément-Jardin des Plantes 6676 506 7.58
7654003 Centre Rive Gauche 7352 571 7.77
7654006 Quartiers Est 3184 399 12.53
7654002 Centre Rive Droite Est 8133 1020 12.54
7654004 Quartiers Ouest 7145 1020 14.28
7654001 Centre Rive Droite Ouest 9664 2350 24.32
7654005 Coteaux Nord 3951 1115 28.22

On peut cartogaphier le résultat pour visualiser la distribution dans la commune :

Code
map2 <- map_quart %>% left_join(tab1)

mf_map(map2, type="choro",var="pct", 
       breaks=c(0,5,10,20,100),
       leg_title = "% passoires",
       leg_val_rnd = 0,
       leg_pos = "topleft")
mf_map(map2, type="prop", var="pas", 
       leg_title = "nb. passoires", 
       leg_pos = "topright",
       inches=0.2,
       col="red")
mf_layout("Distribtion des passoires énergétiques par quartiers à Rouen", 
          arrow = F,
          frame = T, 
          credits = "Source : IGN & ADEME")

Consommation moyenne d’énergie primaire par m2

Supposons maintenant que l’on veuille calculer pour chaque quartier la valeur moyenne de conosmmation d’énergie par m2.

Code
tab1 <- don %>% group_by(quart_code, quart_name) %>% 
                filter(is.na(con_tot)==F,
                       is.na(sup) ==F) %>%
                summarise(con_tot = sum(con_tot),
                          sup = sum(sup)) %>%
                mutate(con_m2 = con_tot/sup) %>%
                arrange(con_m2)
kable(tab1,
      digits = c(0,0,0,0,2),
      col.names = c("Code","Nom","Consommation totale", "Surface", "Consommation / m2"),
      caption = "Consommation moyenne d'énergie primaire par m2 selon les quartiers")
Consommation moyenne d’énergie primaire par m2 selon les quartiers
Code Nom Consommation totale Surface Consommation / m2
7654008 Chatelet Lombardie 20502860 133059 154.09
7654010 Saint-Clément-Jardin des Plantes 73275344 407292 179.91
7654009 Grand Mare 34340742 188199 182.47
7654003 Centre Rive Gauche 75064211 393148 190.93
7654006 Quartiers Est 36867568 171576 214.88
7654004 Quartiers Ouest 76970066 347701 221.37
7654002 Centre Rive Droite Est 83604011 373750 223.69
7654007 Sapins 29975978 133836 223.98
7654005 Coteaux Nord 60592161 221901 273.06
7654001 Centre Rive Droite Ouest 122574781 444471 275.78

On peut cartogaphier le résultat pour visualiser la distribution dans la commune :

Code
map2 <- map_quart %>% left_join(tab1)

mf_map(map2, type="choro",var="con_m2", 
      breaks=c(150,180,220,240,280),
       leg_title = "Kwh/m2/an",
       leg_val_rnd = 0,
       leg_pos = "topleft")
mf_map(map2, type="prop", var="con_tot", 
       leg_title = "Kwh", 
       leg_pos = "topright",
       inches=0.2,
       col="red")
mf_layout("Consommation d'énergie primaire par quartier à Rouen", 
          arrow = F,
          frame = T, 
          credits = "Source : IGN & ADEME")